_handleChannels: function(handler, account, conn, channels,
requests, user_action_time, context) {
- this._handlingChannels(account, conn, channels);
+ this._handlingChannels(account, conn, channels, true);
context.accept();
},
- _handlingChannels: function(account, conn, channels) {
+ _handlingChannels: function(account, conn, channels, notify) {
let len = channels.length;
for (let i = 0; i < len; i++) {
let channel = channels[i];
continue;
}
- if (this._tpClient.is_handling_channel(channel)) {
+ // 'notify' will be true when coming from an actual HandleChannels
+ // call, and not when from a successful Claim call. The point is
+ // we don't want to notify for a channel we just claimed which
+ // has no new messages (for example, a new channel which only has
+ // a delivery notification). We rely on _displayPendingMessages()
+ // and _messageReceived() to notify for new messages.
+
+ // But we should still notify from HandleChannels because the
+ // Telepathy spec states that handlers must foreground channels
+ // in HandleChannels calls which are already being handled.
+
+ if (notify && this._tpClient.is_handling_channel(channel)) {
// We are already handling the channel, display the source
let source = this._chatSources[channel.get_object_path()];
if (source)
Lang.bind(this, function(dispatchOp, result) {
try {
dispatchOp.claim_with_finish(result);
- this._handlingChannels(account, conn, [channel]);
+ this._handlingChannels(account, conn, [channel], false);
} catch (err) {
throw new Error('Failed to Claim channel: ' + err);
}}));